package org.aeon.fasttasks.core;

import org.aeon.fasttasks.core.annotation.LoopTask;
import org.aeon.fasttasks.core.annotation.LoopTaskPro;
import org.aeon.fasttasks.core.manager.TaskContext;

import java.util.Map;

/**
 * @author aeon
 * @createTime 2025/08/05  16:04
 * @description 任务接口
 */
public interface Task {
    /**
     * 任务数据准备
     * 会在并发前执行，并且数据会共享到并发任务每个
     * 不会进行重试
     * 和{@link #prepareData(TaskContext)},{@link #prepareData(TaskContext, boolean)}三选一
     *
     * @return Data
     * @throws Exception
     */
    default Map<?, ?> prepareData() throws Exception {
        return Map.of();
    }

    /**
     * 任务数据准备
     * 会在并发前执行，并且数据会共享到并发任务每个
     * 不会进行重试
     * 和{@link #prepareData()},{@link #prepareData(TaskContext, boolean)}三选一
     *
     * @param taskContext 任务上下文
     * @return Data
     * @throws Exception
     */
    default Map<?, ?> prepareData(TaskContext taskContext) throws Exception {
        return prepareData();
    }

    /**
     * 任务数据准备
     * 会在并发前执行，并且数据会共享到并发任务每个
     * 不会进行重试
     * 和{@link #prepareData()},{@link #prepareData(TaskContext)}三选一
     *
     * @param taskContext 任务上下文
     * @param isRePrepare 是否重新准备
     * @return Data
     * @throws Exception
     */
    default Map<?, ?> prepareData(TaskContext taskContext, boolean isRePrepare) throws Exception {
        return prepareData(taskContext);
    }

    /**
     * 是否重新准备
     * 返回 true 会在同步循环的开始重新执行{@link #prepareData(TaskContext)}
     * 只有在{@link LoopTask#async()}为 false 且{@link LoopTask#count()}>1 时有效
     *
     * @return
     * @see LoopTask
     * @see LoopTaskPro
     */
    default boolean isRePrepare() {
        return false;
    }

    /**
     * 是否重新准备
     * 返回 true 会在同步循环的开始重新执行{@link #prepareData(TaskContext)}
     * 只有在{@link LoopTask#async()}为 false 且{@link LoopTask#count()}>1 时有效
     *
     * @param taskContext 任务上下文
     * @return
     * @see LoopTaskPro
     */
    default boolean isRePrepare(TaskContext taskContext) {
        return isRePrepare();
    }

    /**
     * 任务执行逻辑
     * 和{@link #runTask(TaskContext)}二选一
     *
     * @throws Exception
     */
    default void runTask() throws Exception {
    }

    /**
     * 任务执行逻辑
     * 和{@link #runTask()}二选一
     *
     * @param taskContext 任务上下文
     * @throws Exception
     */
    default void runTask(TaskContext taskContext) throws Exception {
        runTask();
    }

    /**
     * 任务名称
     *
     * @return
     */
    default String getName() {
        return this.getClass().getSimpleName();
    }

    /**
     * 任务优先级
     * 值越小优先级越高
     * <p>
     * 在有前置任务的情况下不稳定
     * 在少量任务下不稳定
     *
     * @return
     */
    default int getPriority() {
        return 0;
    }

    /**
     * 若为 true 则失败完成视为成功完成
     *
     * @return
     */
    default boolean isIgnoreException() {
        return false;
    }

    /**
     * 当任务存在清单中完成后
     * 当系统重启时不会重新执行该任务
     * 会视为执行成功
     *
     * @return
     */
    default boolean isOnlyOnce() {
        return false;
    }

    /**
     * 任务重试次数
     *
     * @return
     */
    default int getRetry() {
        return 0;
    }

    /**
     * 任务重试间隔
     *
     * @return
     */
    default long getRetryInterval() {
        return 0;
    }

}
